install.packages("Signac") #seurat addon for analyzing chromatin
library(hdf5r) #need to read h5 files
library(Seurat)
library(Signac)
library(ggplot2)
library(patchwork)
setwd("C:\\singlecell_atac")
getwd()
[1] "C:/singlecell_atac"
Pre-processing workflow
counts <- Read10X_h5("GSE190424_RAW\\Aged\\GSM5723632_Aged_HSC_filtered_peak_bc_matrix.h5")
# counts is a feature by cell matrix, here features are coordinates of peaks.
counts # 167771 features x 3694 cells
meta <- read.csv("GSE190424_RAW\\Aged\\GSM5723632_Aged_HSC_singlecell.csv.gz",
header=TRUE,
row.names = 1)
meta
chrom_assay <- CreateChromatinAssay(
counts = counts,
sep = c(":", "-"), # features (chr1:3670444-3672753, look in counts) are sep by : and ,
genome = 'mm10',
fragments = 'GSE190424_RAW\\Aged\\GSM5723632_Aged_HSC_fragments.tsv.gz',
min.cells = 10, # Keep peaks found in ≥10 cells.
min.features = 200 # Keep cells with ≥200 peaks
)
Checking for 3694 cell barcodes
# Notes:
#
# Make sure fragments and its index are in same folder
# Names of both files should match except for the .tbi
# for example: see below
list.files("GSE190424_RAW\\Aged")
[1] "GSM5723632_Aged_HSC_filtered_peak_bc_matrix.h5"
[2] "GSM5723632_Aged_HSC_fragments.tsv.gz"
[3] "GSM5723632_Aged_HSC_fragments.tsv.gz.tbi"
[4] "GSM5723632_Aged_HSC_singlecell.csv.gz"
data <- CreateSeuratObject(
counts = chrom_assay,
assay = "peaks",
meta.data = meta
)
data
An object of class Seurat
148897 features across 3694 samples within 1 assay
Active assay: peaks (148897 features, 0 variable features)
2 layers present: counts, data
data[[]]
if (!require("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("EnsDb.Mmusculus.v79") # EnsDb.Hsapiens.v86 for human
BiocManager::install("GenomeInfoDb") #translation between chromosome names
BiocManager::install("biovizBase")
library(EnsDb.Mmusculus.v79)
library(GenomeInfoDb)
# get all annotated mouse genes from Ensembl-based annotation database
annotations <- GetGRangesFromEnsDb(ensdb = EnsDb.Mmusculus.v79)
seqlevelsStyle(annotations) <- 'UCSC'
# Note: features have chr1 prefix which is UCSC-style chromosome names.
annotations
GRanges object with 1763965 ranges and 5 metadata columns:
seqnames ranges strand | tx_id gene_name
<Rle> <IRanges> <Rle> | <character> <character>
ENSMUSE00001236884 chr3 3508030-3508332 + | ENSMUST00000108393 Hnf4g
ENSMUSE00000676606 chr3 3634150-3634347 + | ENSMUST00000108394 Hnf4g
ENSMUSE00001345708 chr3 3638059-3638230 + | ENSMUST00000108393 Hnf4g
ENSMUSE00001345708 chr3 3638059-3638230 + | ENSMUST00000108394 Hnf4g
ENSMUSE00000149313 chr3 3641223-3641317 + | ENSMUST00000108393 Hnf4g
... ... ... ... . ... ...
ENSMUST00000082414 chrM 10167-11544 + | ENSMUST00000082414 mt-Nd4
ENSMUST00000082418 chrM 11742-13565 + | ENSMUST00000082418 mt-Nd5
ENSMUST00000082419 chrM 13552-14070 - | ENSMUST00000082419 mt-Nd6
ENSMUST00000082421 chrM 14145-15288 + | ENSMUST00000082421 mt-Cytb
ENSMUST00000084013 chrM 9877-10173 + | ENSMUST00000084013 mt-Nd4l
gene_id gene_biotype type
<character> <character> <factor>
ENSMUSE00001236884 ENSMUSG00000017688 protein_coding exon
ENSMUSE00000676606 ENSMUSG00000017688 protein_coding exon
ENSMUSE00001345708 ENSMUSG00000017688 protein_coding exon
ENSMUSE00001345708 ENSMUSG00000017688 protein_coding exon
ENSMUSE00000149313 ENSMUSG00000017688 protein_coding exon
... ... ... ...
ENSMUST00000082414 ENSMUSG00000064363 protein_coding cds
ENSMUST00000082418 ENSMUSG00000064367 protein_coding cds
ENSMUST00000082419 ENSMUSG00000064368 protein_coding cds
ENSMUST00000082421 ENSMUSG00000064370 protein_coding cds
ENSMUST00000084013 ENSMUSG00000065947 protein_coding cds
-------
seqinfo: 22 sequences (1 circular) from mm10 genome
Annotation(data) <- annotations
Computing QC Metrics
# 1. Look at the fragment length periodicity for all the cells
data <- NucleosomeSignal(object = data)
Found 3694 cell barcodes
Done Processing 1 million lines
Done Processing 2 million lines
Done Processing 3 million lines
Done Processing 4 million lines
Done Processing 5 million lines
Done Processing 6 million lines
Done Processing 7 million lines
Done Processing 8 million lines
Done Processing 9 million lines
Done Processing 10 million lines
Done Processing 11 million lines
Done Processing 12 million lines
Done Processing 13 million lines
Done Processing 14 million lines
Done Processing 15 million lines
Done Processing 16 million lines
Done Processing 17 million lines
Done Processing 18 million lines
# Note:
# Signac looks at all fragments in each cell and bins them by length:
# Fragment length Category
# 0–100 bp Nucleosome-free (NFR)
# 180–247 bp Mononucleosomal
# 315–473 bp Dinucleosomal
# ......... .............
# Then calculate mononucleosomal/ nucleosome-free ratio
data$nucleosome_group <- ifelse(data$nucleosome_signal > 4, 'NS > 4', 'NS < 4')
unique(data$nucleosome_group)
[1] "NS < 4"
# no low-quality cells dominated by mononucleosomal fragments.
FragmentHistogram(object = data,
group.by = 'nucleosome_group',
region = 'chr1-1-10000000')

#Note:
# cells exhibit a pattern that is typical for a successful ATAC-seq experiment.
# 2. Calculate the TSS enrichment score for each cell
data <- TSSEnrichment(data, fast = FALSE)
# 3. Compute fraction of reads from blacklisted region
# in data[[]] there is a column blacklist_region_fragments
# number of fragments mapped to black list regions
data$blacklist_ratio <- data$blacklist_region_fragments / data$peak_region_fragments
data$pct_reads_in_peaks <- data$peak_region_fragments / data$passed_filters * 100
vln <- VlnPlot(
object = data,
features = c('peak_region_fragments', 'pct_reads_in_peaks',
'blacklist_ratio', 'nucleosome_signal', 'TSS.enrichment'),
pt.size = 0.1,
ncol = 5
)
vln

Remove cells that are outliers for these QC metrics
data
An object of class Seurat
148897 features across 3694 samples within 1 assay
Active assay: peaks (148897 features, 0 variable features)
2 layers present: counts, data
# option 1: Set manual thresholdsbased on the violin plot
data_filtered <- subset(
x = data,
subset = peak_region_fragments > 3000 &
peak_region_fragments < 40000 &
pct_reads_in_peaks > 60 &
blacklist_ratio < 0.02 &
nucleosome_signal < 4 &
TSS.enrichment > 2
)
data_filtered
An object of class Seurat
148897 features across 3493 samples within 1 assay
Active assay: peaks (148897 features, 0 variable features)
2 layers present: counts, data
# Option 2: Based on quantiles
low_prf <- quantile(data[["peak_region_fragments"]]$peak_region_fragments, probs = 0.02)
hig_prf <- quantile(data[["peak_region_fragments"]]$peak_region_fragments, probs = 0.98)
low_prp <- quantile(data[["pct_reads_in_peaks"]]$pct_reads_in_peaks, probs = 0.02)
high_blr <- quantile(data[["blacklist_ratio"]]$blacklist_ratio, probs = 0.98)
hig_ns <- quantile(data[["nucleosome_signal"]]$nucleosome_signal, probs = 0.98)
low_ts <- quantile(data[["TSS.enrichment"]]$TSS.enrichment, probs = 0.02)
print(low_prf)
2%
2280.18
print(hig_prf)
98%
22501.22
print(low_prp)
2%
69.90098
print(high_blr)
98%
0.01488525
print(hig_ns)
98%
0.8913645
print(low_ts)
2%
3.73821
data <- subset(
x = data,
subset = peak_region_fragments > low_prf &
peak_region_fragments < hig_prf &
pct_reads_in_peaks > low_prp &
blacklist_ratio < high_blr &
nucleosome_signal < hig_ns &
TSS.enrichment > low_ts
)
data
An object of class Seurat
148897 features across 3300 samples within 1 assay
Active assay: peaks (148897 features, 0 variable features)
2 layers present: counts, data
Normalization and linear dimensional reduction
data <- RunTFIDF(data)
data <- FindTopFeatures(data, min.cutoff = 'q0')
data
An object of class Seurat
148897 features across 3300 samples within 1 assay
Active assay: peaks (148897 features, 148897 variable features)
2 layers present: counts, data
data <- RunSVD(data)
DepthCor(data)

# Note:
# Component 1 is strongly correlated to sequencing depth (technical variation).
# rather than biological variation
# Remove this component
Non-linear dimension reduction and clustering
data <- RunUMAP(
object = data,
reduction = 'lsi',
dims = 2:30
)
data <- FindNeighbors(
object = data,
reduction = 'lsi',
dims = 2:30
)
data <- FindClusters(
object = data,
algorithm = 3,
verbose = FALSE
)
DimPlot(object = data, label = TRUE, pt.size = 1) + NoLegend()

# Using data_filtered
data_filtered <- RunTFIDF(data_filtered)
data_filtered <- FindTopFeatures(data_filtered, min.cutoff = 'q0')
data_filtered <- RunSVD(object = data_filtered)
DepthCor(data_filtered)

data_filtered <- RunUMAP(
object = data_filtered,
reduction = 'lsi',
dims = 2:30
)
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
data_filtered <- FindNeighbors(
object = data_filtered,
reduction = 'lsi',
dims = 2:30
)
data_filtered <- FindClusters(
object = data_filtered,
algorithm = 3,
resolution = 1.2,
verbose = FALSE
)
DimPlot(object = data_filtered, label = TRUE, pt.size = 1) + NoLegend()

# Note:
# One primary cluster - because data is from aged mice
# Many subclsuters within main cluster
Multiple samples
# Function with all the preprocessing steps and informative print messages
prepare_data <- function(count_path, meta_path, fragment_path){
message("Step 1: Reading count data...")
counts <- Read10X_h5(count_path)
message("Count data loaded successfully.")
message("Step 2: Reading metadata...")
meta <- read.csv(meta_path,
header = TRUE,
row.names = 1)
message("Metadata loaded successfully.")
message("Step 3: Creating ChromatinAssay object...")
chrom_assay <- CreateChromatinAssay(
counts = counts,
sep = c(":", "-"),
genome = 'mm10',
fragments = fragment_path,
min.cells = 10,
min.features = 200
)
message("ChromatinAssay created successfully.")
message("Step 4: Creating Seurat object...")
data <- CreateSeuratObject(
counts = chrom_assay,
assay = "peaks",
meta.data = meta
)
message("Seurat object created successfully.")
message("Step 5: Annotating data...")
Annotation(data) <- annotations
message("Annotation completed.")
message("Step 6: Computing QC metrics (nucleosome signal, TSS enrichment, blacklist ratio, % reads in peaks)...")
data <- NucleosomeSignal(object = data)
data <- TSSEnrichment(object = data, fast = FALSE)
data$blacklist_ratio <- data$blacklist_region_fragments / data$peak_region_fragments
data$pct_reads_in_peaks <- data$peak_region_fragments / data$passed_filters * 100
message("QC metrics computation completed.")
message("Step 7: Calculating filtering thresholds...")
low_prf <- quantile(data[["peak_region_fragments"]]$peak_region_fragments, probs = 0.02)
hig_prf <- quantile(data[["peak_region_fragments"]]$peak_region_fragments, probs = 0.98)
low_prp <- quantile(data[["pct_reads_in_peaks"]]$pct_reads_in_peaks, probs = 0.02)
high_blr <- quantile(data[["blacklist_ratio"]]$blacklist_ratio, probs = 0.98)
hig_ns <- quantile(data[["nucleosome_signal"]]$nucleosome_signal, probs = 0.98)
low_ts <- quantile(data[["TSS.enrichment"]]$TSS.enrichment, probs = 0.02)
message("Filtering thresholds calculated.")
message("Step 8: Filtering data based on QC thresholds...")
data <- subset(
x = data,
subset = peak_region_fragments > low_prf &
peak_region_fragments < hig_prf &
pct_reads_in_peaks > low_prp &
blacklist_ratio < high_blr &
nucleosome_signal < hig_ns &
TSS.enrichment > low_ts
)
message("Data filtering completed.")
message("All preprocessing steps completed successfully.")
return(data)
}
aged <- prepare_data("GSE190424_RAW\\Aged\\GSM5723632_Aged_HSC_filtered_peak_bc_matrix.h5",
"GSE190424_RAW\\Aged\\GSM5723632_Aged_HSC_singlecell.csv.gz",
"GSE190424_RAW\\Aged\\GSM5723632_Aged_HSC_fragments.tsv.gz"
)
Checking for 3694 cell barcodes
Found 3694 cell barcodes
Done Processing 1 million lines
Done Processing 2 million lines
Done Processing 3 million lines
Done Processing 4 million lines
Done Processing 5 million lines
Done Processing 6 million lines
Done Processing 7 million lines
Done Processing 8 million lines
Done Processing 9 million lines
Done Processing 10 million lines
Done Processing 11 million lines
Done Processing 12 million lines
Done Processing 13 million lines
Done Processing 14 million lines
Done Processing 15 million lines
Done Processing 16 million lines
Done Processing 17 million lines
Done Processing 18 million lines
young <- prepare_data("GSE190424_RAW\\Young\\GSM5723631_Young_HSC_filtered_peak_bc_matrix.h5",
"GSE190424_RAW\\Young\\GSM5723631_Young_HSC_singlecell.csv.gz",
"GSE190424_RAW\\Young\\GSM5723631_Young_HSC_fragments.tsv.gz"
)
Checking for 5028 cell barcodes
Found 5028 cell barcodes
Done Processing 1 million lines
Done Processing 2 million lines
Done Processing 3 million lines
Done Processing 4 million lines
Done Processing 5 million lines
Done Processing 6 million lines
Done Processing 7 million lines
Done Processing 8 million lines
Done Processing 9 million lines
Done Processing 10 million lines
Done Processing 11 million lines
Done Processing 12 million lines
Done Processing 13 million lines
Done Processing 14 million lines
Done Processing 15 million lines
Done Processing 16 million lines
Done Processing 17 million lines
Done Processing 18 million lines
Done Processing 19 million lines
Done Processing 20 million lines
Done Processing 21 million lines
Done Processing 22 million lines
Done Processing 23 million lines
Done Processing 24 million lines
Done Processing 25 million lines
# Add new column to differentiate between sample aged and young
young$sample <- "young"
aged$sample <- "aged"
aged[[]]
young[[]]
combined_data <- merge(young, aged)
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|=== | 3%
|
|=== | 4%
|
|==== | 4%
|
|==== | 5%
|
|==== | 6%
|
|===== | 6%
|
|===== | 7%
|
|====== | 7%
|
|====== | 8%
|
|======= | 8%
|
|======= | 9%
|
|======== | 9%
|
|======== | 10%
|
|======== | 11%
|
|========= | 11%
|
|========= | 12%
|
|========== | 12%
|
|========== | 13%
|
|=========== | 13%
|
|=========== | 14%
|
|=========== | 15%
|
|============ | 15%
|
|============ | 16%
|
|============= | 16%
|
|============= | 17%
|
|============== | 17%
|
|============== | 18%
|
|=============== | 18%
|
|=============== | 19%
|
|=============== | 20%
|
|================ | 20%
|
|================ | 21%
|
|================= | 21%
|
|================= | 22%
|
|================== | 22%
|
|================== | 23%
|
|=================== | 23%
|
|=================== | 24%
|
|=================== | 25%
|
|==================== | 25%
|
|==================== | 26%
|
|===================== | 26%
|
|===================== | 27%
|
|====================== | 27%
|
|====================== | 28%
|
|======================= | 28%
|
|======================= | 29%
|
|======================= | 30%
|
|======================== | 30%
|
|======================== | 31%
|
|========================= | 31%
|
|========================= | 32%
|
|========================== | 32%
|
|========================== | 33%
|
|========================== | 34%
|
|=========================== | 34%
|
|=========================== | 35%
|
|============================ | 35%
|
|============================ | 36%
|
|============================= | 36%
|
|============================= | 37%
|
|============================== | 37%
|
|============================== | 38%
|
|============================== | 39%
|
|=============================== | 39%
|
|=============================== | 40%
|
|================================ | 40%
|
|================================ | 41%
|
|================================= | 41%
|
|================================= | 42%
|
|================================== | 42%
|
|================================== | 43%
|
|================================== | 44%
|
|=================================== | 44%
|
|=================================== | 45%
|
|==================================== | 45%
|
|==================================== | 46%
|
|===================================== | 46%
|
|===================================== | 47%
|
|====================================== | 47%
|
|====================================== | 48%
|
|====================================== | 49%
|
|======================================= | 49%
|
|======================================= | 50%
|
|======================================== | 50%
|
|======================================== | 51%
|
|========================================= | 51%
|
|========================================= | 52%
|
|========================================= | 53%
|
|========================================== | 53%
|
|========================================== | 54%
|
|=========================================== | 54%
|
|=========================================== | 55%
|
|============================================ | 55%
|
|============================================ | 56%
|
|============================================= | 56%
|
|============================================= | 57%
|
|============================================= | 58%
|
|============================================== | 58%
|
|============================================== | 59%
|
|=============================================== | 59%
|
|=============================================== | 60%
|
|================================================ | 60%
|
|================================================ | 61%
|
|================================================= | 61%
|
|================================================= | 62%
|
|================================================= | 63%
|
|================================================== | 63%
|
|================================================== | 64%
|
|=================================================== | 64%
|
|=================================================== | 65%
|
|==================================================== | 65%
|
|==================================================== | 66%
|
|===================================================== | 66%
|
|===================================================== | 67%
|
|===================================================== | 68%
|
|====================================================== | 68%
|
|====================================================== | 69%
|
|======================================================= | 69%
|
|======================================================= | 70%
|
|======================================================== | 70%
|
|======================================================== | 71%
|
|======================================================== | 72%
|
|========================================================= | 72%
|
|========================================================= | 73%
|
|========================================================== | 73%
|
|========================================================== | 74%
|
|=========================================================== | 74%
|
|=========================================================== | 75%
|
|============================================================ | 75%
|
|============================================================ | 76%
|
|============================================================ | 77%
|
|============================================================= | 77%
|
|============================================================= | 78%
|
|============================================================== | 78%
|
|============================================================== | 79%
|
|=============================================================== | 79%
|
|=============================================================== | 80%
|
|================================================================ | 80%
|
|================================================================ | 81%
|
|================================================================ | 82%
|
|================================================================= | 82%
|
|================================================================= | 83%
|
|================================================================== | 83%
|
|================================================================== | 84%
|
|=================================================================== | 84%
|
|=================================================================== | 85%
|
|==================================================================== | 85%
|
|==================================================================== | 86%
|
|==================================================================== | 87%
|
|===================================================================== | 87%
|
|===================================================================== | 88%
|
|====================================================================== | 88%
|
|====================================================================== | 89%
|
|======================================================================= | 89%
|
|======================================================================= | 90%
|
|======================================================================= | 91%
|
|======================================================================== | 91%
|
|======================================================================== | 92%
|
|========================================================================= | 92%
|
|========================================================================= | 93%
|
|========================================================================== | 93%
|
|========================================================================== | 94%
|
|=========================================================================== | 94%
|
|=========================================================================== | 95%
|
|=========================================================================== | 96%
|
|============================================================================ | 96%
|
|============================================================================ | 97%
|
|============================================================================= | 97%
|
|============================================================================= | 98%
|
|============================================================================== | 98%
|
|============================================================================== | 99%
|
|===============================================================================| 99%
|
|===============================================================================| 100%
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|=== | 3%
|
|=== | 4%
|
|==== | 4%
|
|==== | 5%
|
|==== | 6%
|
|===== | 6%
|
|===== | 7%
|
|====== | 7%
|
|====== | 8%
|
|======= | 8%
|
|======= | 9%
|
|======== | 9%
|
|======== | 10%
|
|======== | 11%
|
|========= | 11%
|
|========= | 12%
|
|========== | 12%
|
|========== | 13%
|
|=========== | 13%
|
|=========== | 14%
|
|=========== | 15%
|
|============ | 15%
|
|============ | 16%
|
|============= | 16%
|
|============= | 17%
|
|============== | 17%
|
|============== | 18%
|
|=============== | 18%
|
|=============== | 19%
|
|=============== | 20%
|
|================ | 20%
|
|================ | 21%
|
|================= | 21%
|
|================= | 22%
|
|================== | 22%
|
|================== | 23%
|
|=================== | 23%
|
|=================== | 24%
|
|=================== | 25%
|
|==================== | 25%
|
|==================== | 26%
|
|===================== | 26%
|
|===================== | 27%
|
|====================== | 27%
|
|====================== | 28%
|
|======================= | 28%
|
|======================= | 29%
|
|======================= | 30%
|
|======================== | 30%
|
|======================== | 31%
|
|========================= | 31%
|
|========================= | 32%
|
|========================== | 32%
|
|========================== | 33%
|
|========================== | 34%
|
|=========================== | 34%
|
|=========================== | 35%
|
|============================ | 35%
|
|============================ | 36%
|
|============================= | 36%
|
|============================= | 37%
|
|============================== | 37%
|
|============================== | 38%
|
|============================== | 39%
|
|=============================== | 39%
|
|=============================== | 40%
|
|================================ | 40%
|
|================================ | 41%
|
|================================= | 41%
|
|================================= | 42%
|
|================================== | 42%
|
|================================== | 43%
|
|================================== | 44%
|
|=================================== | 44%
|
|=================================== | 45%
|
|==================================== | 45%
|
|==================================== | 46%
|
|===================================== | 46%
|
|===================================== | 47%
|
|====================================== | 47%
|
|====================================== | 48%
|
|====================================== | 49%
|
|======================================= | 49%
|
|======================================= | 50%
|
|======================================== | 50%
|
|======================================== | 51%
|
|========================================= | 51%
|
|========================================= | 52%
|
|========================================= | 53%
|
|========================================== | 53%
|
|========================================== | 54%
|
|=========================================== | 54%
|
|=========================================== | 55%
|
|============================================ | 55%
|
|============================================ | 56%
|
|============================================= | 56%
|
|============================================= | 57%
|
|============================================= | 58%
|
|============================================== | 58%
|
|============================================== | 59%
|
|=============================================== | 59%
|
|=============================================== | 60%
|
|================================================ | 60%
|
|================================================ | 61%
|
|================================================= | 61%
|
|================================================= | 62%
|
|================================================= | 63%
|
|================================================== | 63%
|
|================================================== | 64%
|
|=================================================== | 64%
|
|=================================================== | 65%
|
|==================================================== | 65%
|
|==================================================== | 66%
|
|===================================================== | 66%
|
|===================================================== | 67%
|
|===================================================== | 68%
|
|====================================================== | 68%
|
|====================================================== | 69%
|
|======================================================= | 69%
|
|======================================================= | 70%
|
|======================================================== | 70%
|
|======================================================== | 71%
|
|======================================================== | 72%
|
|========================================================= | 72%
|
|========================================================= | 73%
|
|========================================================== | 73%
|
|========================================================== | 74%
|
|=========================================================== | 74%
|
|=========================================================== | 75%
|
|============================================================ | 75%
|
|============================================================ | 76%
|
|============================================================ | 77%
|
|============================================================= | 77%
|
|============================================================= | 78%
|
|============================================================== | 78%
|
|============================================================== | 79%
|
|=============================================================== | 79%
|
|=============================================================== | 80%
|
|================================================================ | 80%
|
|================================================================ | 81%
|
|================================================================ | 82%
|
|================================================================= | 82%
|
|================================================================= | 83%
|
|================================================================== | 83%
|
|================================================================== | 84%
|
|=================================================================== | 84%
|
|=================================================================== | 85%
|
|==================================================================== | 85%
|
|==================================================================== | 86%
|
|==================================================================== | 87%
|
|===================================================================== | 87%
|
|===================================================================== | 88%
|
|====================================================================== | 88%
|
|====================================================================== | 89%
|
|======================================================================= | 89%
|
|======================================================================= | 90%
|
|======================================================================= | 91%
|
|======================================================================== | 91%
|
|======================================================================== | 92%
|
|========================================================================= | 92%
|
|========================================================================= | 93%
|
|========================================================================== | 93%
|
|========================================================================== | 94%
|
|=========================================================================== | 94%
|
|=========================================================================== | 95%
|
|=========================================================================== | 96%
|
|============================================================================ | 96%
|
|============================================================================ | 97%
|
|============================================================================= | 97%
|
|============================================================================= | 98%
|
|============================================================================== | 98%
|
|============================================================================== | 99%
|
|===============================================================================| 99%
|
|===============================================================================| 100%
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|=== | 3%
|
|=== | 4%
|
|==== | 4%
|
|==== | 5%
|
|==== | 6%
|
|===== | 6%
|
|===== | 7%
|
|====== | 7%
|
|====== | 8%
|
|======= | 8%
|
|======= | 9%
|
|======== | 9%
|
|======== | 10%
|
|======== | 11%
|
|========= | 11%
|
|========= | 12%
|
|========== | 12%
|
|========== | 13%
|
|=========== | 13%
|
|=========== | 14%
|
|=========== | 15%
|
|============ | 15%
|
|============ | 16%
|
|============= | 16%
|
|============= | 17%
|
|============== | 17%
|
|============== | 18%
|
|=============== | 18%
|
|=============== | 19%
|
|=============== | 20%
|
|================ | 20%
|
|================ | 21%
|
|================= | 21%
|
|================= | 22%
|
|================== | 22%
|
|================== | 23%
|
|=================== | 23%
|
|=================== | 24%
|
|=================== | 25%
|
|==================== | 25%
|
|==================== | 26%
|
|===================== | 26%
|
|===================== | 27%
|
|====================== | 27%
|
|====================== | 28%
|
|======================= | 28%
|
|======================= | 29%
|
|======================= | 30%
|
|======================== | 30%
|
|======================== | 31%
|
|========================= | 31%
|
|========================= | 32%
|
|========================== | 32%
|
|========================== | 33%
|
|========================== | 34%
|
|=========================== | 34%
|
|=========================== | 35%
|
|============================ | 35%
|
|============================ | 36%
|
|============================= | 36%
|
|============================= | 37%
|
|============================== | 37%
|
|============================== | 38%
|
|============================== | 39%
|
|=============================== | 39%
|
|=============================== | 40%
|
|================================ | 40%
|
|================================ | 41%
|
|================================= | 41%
|
|================================= | 42%
|
|================================== | 42%
|
|================================== | 43%
|
|================================== | 44%
|
|=================================== | 44%
|
|=================================== | 45%
|
|==================================== | 45%
|
|==================================== | 46%
|
|===================================== | 46%
|
|===================================== | 47%
|
|====================================== | 47%
|
|====================================== | 48%
|
|====================================== | 49%
|
|======================================= | 49%
|
|======================================= | 50%
|
|======================================== | 50%
|
|======================================== | 51%
|
|========================================= | 51%
|
|========================================= | 52%
|
|========================================= | 53%
|
|========================================== | 53%
|
|========================================== | 54%
|
|=========================================== | 54%
|
|=========================================== | 55%
|
|============================================ | 55%
|
|============================================ | 56%
|
|============================================= | 56%
|
|============================================= | 57%
|
|============================================= | 58%
|
|============================================== | 58%
|
|============================================== | 59%
|
|=============================================== | 59%
|
|=============================================== | 60%
|
|================================================ | 60%
|
|================================================ | 61%
|
|================================================= | 61%
|
|================================================= | 62%
|
|================================================= | 63%
|
|================================================== | 63%
|
|================================================== | 64%
|
|=================================================== | 64%
|
|=================================================== | 65%
|
|==================================================== | 65%
|
|==================================================== | 66%
|
|===================================================== | 66%
|
|===================================================== | 67%
|
|===================================================== | 68%
|
|====================================================== | 68%
|
|====================================================== | 69%
|
|======================================================= | 69%
|
|======================================================= | 70%
|
|======================================================== | 70%
|
|======================================================== | 71%
|
|======================================================== | 72%
|
|========================================================= | 72%
|
|========================================================= | 73%
|
|========================================================== | 73%
|
|========================================================== | 74%
|
|=========================================================== | 74%
|
|=========================================================== | 75%
|
|============================================================ | 75%
|
|============================================================ | 76%
|
|============================================================ | 77%
|
|============================================================= | 77%
|
|============================================================= | 78%
|
|============================================================== | 78%
|
|============================================================== | 79%
|
|=============================================================== | 79%
|
|=============================================================== | 80%
|
|================================================================ | 80%
|
|================================================================ | 81%
|
|================================================================ | 82%
|
|================================================================= | 82%
|
|================================================================= | 83%
|
|================================================================== | 83%
|
|================================================================== | 84%
|
|=================================================================== | 84%
|
|=================================================================== | 85%
|
|==================================================================== | 85%
|
|==================================================================== | 86%
|
|==================================================================== | 87%
|
|===================================================================== | 87%
|
|===================================================================== | 88%
|
|====================================================================== | 88%
|
|====================================================================== | 89%
|
|======================================================================= | 89%
|
|======================================================================= | 90%
|
|======================================================================= | 91%
|
|======================================================================== | 91%
|
|======================================================================== | 92%
|
|========================================================================= | 92%
|
|========================================================================= | 93%
|
|========================================================================== | 93%
|
|========================================================================== | 94%
|
|=========================================================================== | 94%
|
|=========================================================================== | 95%
|
|=========================================================================== | 96%
|
|============================================================================ | 96%
|
|============================================================================ | 97%
|
|============================================================================= | 97%
|
|============================================================================= | 98%
|
|============================================================================== | 98%
|
|============================================================================== | 99%
|
|===============================================================================| 99%
|
|===============================================================================| 100%
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|=== | 3%
|
|=== | 4%
|
|==== | 4%
|
|==== | 5%
|
|==== | 6%
|
|===== | 6%
|
|===== | 7%
|
|====== | 7%
|
|====== | 8%
|
|======= | 8%
|
|======= | 9%
|
|======== | 9%
|
|======== | 10%
|
|======== | 11%
|
|========= | 11%
|
|========= | 12%
|
|========== | 12%
|
|========== | 13%
|
|=========== | 13%
|
|=========== | 14%
|
|=========== | 15%
|
|============ | 15%
|
|============ | 16%
|
|============= | 16%
|
|============= | 17%
|
|============== | 17%
|
|============== | 18%
|
|=============== | 18%
|
|=============== | 19%
|
|=============== | 20%
|
|================ | 20%
|
|================ | 21%
|
|================= | 21%
|
|================= | 22%
|
|================== | 22%
|
|================== | 23%
|
|=================== | 23%
|
|=================== | 24%
|
|=================== | 25%
|
|==================== | 25%
|
|==================== | 26%
|
|===================== | 26%
|
|===================== | 27%
|
|====================== | 27%
|
|====================== | 28%
|
|======================= | 28%
|
|======================= | 29%
|
|======================= | 30%
|
|======================== | 30%
|
|======================== | 31%
|
|========================= | 31%
|
|========================= | 32%
|
|========================== | 32%
|
|========================== | 33%
|
|========================== | 34%
|
|=========================== | 34%
|
|=========================== | 35%
|
|============================ | 35%
|
|============================ | 36%
|
|============================= | 36%
|
|============================= | 37%
|
|============================== | 37%
|
|============================== | 38%
|
|============================== | 39%
|
|=============================== | 39%
|
|=============================== | 40%
|
|================================ | 40%
|
|================================ | 41%
|
|================================= | 41%
|
|================================= | 42%
|
|================================== | 42%
|
|================================== | 43%
|
|================================== | 44%
|
|=================================== | 44%
|
|=================================== | 45%
|
|==================================== | 45%
|
|==================================== | 46%
|
|===================================== | 46%
|
|===================================== | 47%
|
|====================================== | 47%
|
|====================================== | 48%
|
|====================================== | 49%
|
|======================================= | 49%
|
|======================================= | 50%
|
|======================================== | 50%
|
|======================================== | 51%
|
|========================================= | 51%
|
|========================================= | 52%
|
|========================================= | 53%
|
|========================================== | 53%
|
|========================================== | 54%
|
|=========================================== | 54%
|
|=========================================== | 55%
|
|============================================ | 55%
|
|============================================ | 56%
|
|============================================= | 56%
|
|============================================= | 57%
|
|============================================= | 58%
|
|============================================== | 58%
|
|============================================== | 59%
|
|=============================================== | 59%
|
|=============================================== | 60%
|
|================================================ | 60%
|
|================================================ | 61%
|
|================================================= | 61%
|
|================================================= | 62%
|
|================================================= | 63%
|
|================================================== | 63%
|
|================================================== | 64%
|
|=================================================== | 64%
|
|=================================================== | 65%
|
|==================================================== | 65%
|
|==================================================== | 66%
|
|===================================================== | 66%
|
|===================================================== | 67%
|
|===================================================== | 68%
|
|====================================================== | 68%
|
|====================================================== | 69%
|
|======================================================= | 69%
|
|======================================================= | 70%
|
|======================================================== | 70%
|
|======================================================== | 71%
|
|======================================================== | 72%
|
|========================================================= | 72%
|
|========================================================= | 73%
|
|========================================================== | 73%
|
|========================================================== | 74%
|
|=========================================================== | 74%
|
|=========================================================== | 75%
|
|============================================================ | 75%
|
|============================================================ | 76%
|
|============================================================ | 77%
|
|============================================================= | 77%
|
|============================================================= | 78%
|
|============================================================== | 78%
|
|============================================================== | 79%
|
|=============================================================== | 79%
|
|=============================================================== | 80%
|
|================================================================ | 80%
|
|================================================================ | 81%
|
|================================================================ | 82%
|
|================================================================= | 82%
|
|================================================================= | 83%
|
|================================================================== | 83%
|
|================================================================== | 84%
|
|=================================================================== | 84%
|
|=================================================================== | 85%
|
|==================================================================== | 85%
|
|==================================================================== | 86%
|
|==================================================================== | 87%
|
|===================================================================== | 87%
|
|===================================================================== | 88%
|
|====================================================================== | 88%
|
|====================================================================== | 89%
|
|======================================================================= | 89%
|
|======================================================================= | 90%
|
|======================================================================= | 91%
|
|======================================================================== | 91%
|
|======================================================================== | 92%
|
|========================================================================= | 92%
|
|========================================================================= | 93%
|
|========================================================================== | 93%
|
|========================================================================== | 94%
|
|=========================================================================== | 94%
|
|=========================================================================== | 95%
|
|=========================================================================== | 96%
|
|============================================================================ | 96%
|
|============================================================================ | 97%
|
|============================================================================= | 97%
|
|============================================================================= | 98%
|
|============================================================================== | 98%
|
|============================================================================== | 99%
|
|===============================================================================| 99%
|
|===============================================================================| 100%
combined_data <- RunTFIDF(combined_data)
combined_data <- FindTopFeatures(combined_data, min.cutoff = 'q0')
combined_data <- RunSVD(object = combined_data)
DepthCor(combined_data)

combined_data <- RunUMAP(object = combined_data, reduction = 'lsi', dims = 2:30)
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
combined_data <- FindNeighbors(object = combined_data, reduction = 'lsi', dims = 2:30)
combined_data <- FindClusters(object = combined_data, verbose = FALSE, algorithm = 3, resolution = .4)
DimPlot(object = combined_data, label = TRUE) + NoLegend()

DimPlot(object = combined_data, label = TRUE, group.by = "sample") + NoLegend()

Data Analysis
# 1. Create a gene activity matrix
# Gene activity based on chromatin accessibility
gene.activities <- GeneActivity(combined_data)
Processed 24766 groups out of 26139. 95% done. Time elapsed: 3s. ETA: 0s.
Processed 26139 groups out of 26139. 100% done. Time elapsed: 3s. ETA: 0s.
| | 0 % ~calculating
|+++++ | 9 % ~03m 26s
|++++++++++ | 18% ~02m 45s
|++++++++++++++ | 27% ~02m 31s
|+++++++++++++++++++ | 36% ~02m 20s
|+++++++++++++++++++++++ | 45% ~01m 51s
|++++++++++++++++++++++++++++ | 55% ~01m 26s
|++++++++++++++++++++++++++++++++ | 64% ~01m 14s
|+++++++++++++++++++++++++++++++++++++ | 73% ~56s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~36s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~18s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03m 19s
| | 0 % ~calculating
|+++++ | 9 % ~02m 41s
|++++++++++ | 18% ~01m 57s
|++++++++++++++ | 27% ~01m 43s
|+++++++++++++++++++ | 36% ~01m 19s
|+++++++++++++++++++++++ | 45% ~01m 16s
|++++++++++++++++++++++++++++ | 55% ~01m 09s
|++++++++++++++++++++++++++++++++ | 64% ~59s
|+++++++++++++++++++++++++++++++++++++ | 73% ~45s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~31s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~16s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03m 01s
# gene.activities
# add the gene activity matrix to the Seurat object as a new assay
combined_data[['RNA']] <- CreateAssayObject(counts = gene.activities)
# Normalize
combined_data <- NormalizeData(
object = combined_data,
assay = 'RNA',
normalization.method = 'LogNormalize',
scale.factor = median(combined_data$nCount_RNA)
)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
combined_data[["RNA"]]
Assay data with 21821 features for 7792 cells
First 10 features:
Hnf4g, Zfhx4, Pex2, UBC, 1700008P02Rik, Pkia, Zc2hc1a, Il7, 1700010I02Rik,
Stmn2
combined_data[["peaks"]]
ChromatinAssay data with 177359 features for 7792 cells
Variable features: 177359
Genome: mm10
Annotation present: TRUE
Motifs present: FALSE
Fragment files: 2
combined_data
An object of class Seurat
199180 features across 7792 samples within 2 assays
Active assay: peaks (177359 features, 177359 variable features)
2 layers present: counts, data
1 other assay present: RNA
2 dimensional reductions calculated: lsi, umap
DefaultAssay(combined_data)
[1] "peaks"
# Set RNA as default assay
DefaultAssay(combined_data) <- 'RNA'
# Plit expression of genes in each cluster
FeaturePlot(
object = combined_data,
features = c("Hnf4g", "Zfhx4", "Pex2", "Pkia"),
max.cutoff = 'q95',
)

# Set default assay back to peaks
DefaultAssay(combined_data) <- 'peaks'
Find differentially accessible peaks between clusters
# peak_region_fragments: total number of reads overlapping any peak per cell
# reflects sequencing depth
# latent.vars = 'peak_region_fragments' adjusts for this
# to remove bias from cells with higher/lower depth
da_peaks <- FindMarkers(
object = combined_data,
ident.1 = rownames(combined_data[[]][combined_data$sample == "aged",]),
ident.2 = rownames(combined_data[[]][combined_data$sample == "young",]),
min.pct = 0.05,
test.use = 'LR',
latent.vars = 'peak_region_fragments'
)
| | 0 % ~calculating
|+ | 1 % ~01h 25m 04s
|+ | 2 % ~01h 06m 54s
|++ | 3 % ~01h 03m 04s
|++ | 4 % ~59m 17s
|+++ | 5 % ~58m 02s
|+++ | 6 % ~56m 07s
|++++ | 7 % ~55m 25s
|++++ | 8 % ~54m 12s
|+++++ | 9 % ~53m 36s
|+++++ | 10% ~58m 05s
|++++++ | 11% ~01h 08m 07s
|++++++ | 12% ~01h 14m 39s
|+++++++ | 13% ~01h 20m 33s
|+++++++ | 14% ~01h 33m 41s
|++++++++ | 15% ~01h 48m 55s
|++++++++ | 16% ~02h 03m 07s
|+++++++++ | 17% ~02h 03m 45s
|+++++++++ | 18% ~02h 12m 26s
|++++++++++ | 19% ~02h 19m 14s
|++++++++++ | 20% ~02h 14m 50s
|+++++++++++ | 21% ~02h 10m 47s
|+++++++++++ | 22% ~02h 07m 55s
|++++++++++++ | 23% ~02h 11m 36s
|++++++++++++ | 24% ~02h 14m 45s
|+++++++++++++ | 25% ~02h 17m 10s
|+++++++++++++ | 26% ~02h 18m 22s
|++++++++++++++ | 27% ~02h 20m 02s
|++++++++++++++ | 28% ~02h 21m 39s
|+++++++++++++++ | 29% ~02h 20m 50s
|+++++++++++++++ | 30% ~02h 18m 44s
|++++++++++++++++ | 31% ~02h 13m 56s
|++++++++++++++++ | 32% ~02h 09m 07s
|+++++++++++++++++ | 33% ~02h 04m 42s
|+++++++++++++++++ | 34% ~02h 03m 43s
|++++++++++++++++++ | 35% ~02h 02m 43s
|++++++++++++++++++ | 36% ~02h 00m 05s
|+++++++++++++++++++ | 37% ~01h 56m 01s
|+++++++++++++++++++ | 38% ~01h 52m 08s
|++++++++++++++++++++ | 39% ~01h 48m 24s
|++++++++++++++++++++ | 40% ~01h 44m 50s
|+++++++++++++++++++++ | 41% ~01h 41m 25s
|+++++++++++++++++++++ | 42% ~01h 38m 17s
|++++++++++++++++++++++ | 43% ~01h 35m 09s
|++++++++++++++++++++++ | 44% ~01h 32m 10s
|+++++++++++++++++++++++ | 45% ~01h 29m 12s
|+++++++++++++++++++++++ | 46% ~01h 26m 20s
|++++++++++++++++++++++++ | 47% ~01h 23m 35s
|++++++++++++++++++++++++ | 48% ~01h 21m 01s
|+++++++++++++++++++++++++ | 49% ~01h 18m 26s
|+++++++++++++++++++++++++ | 50% ~01h 15m 56s
|++++++++++++++++++++++++++ | 51% ~01h 13m 31s
|++++++++++++++++++++++++++ | 52% ~01h 11m 10s
|+++++++++++++++++++++++++++ | 53% ~01h 08m 53s
|+++++++++++++++++++++++++++ | 54% ~01h 06m 45s
|++++++++++++++++++++++++++++ | 55% ~01h 04m 36s
|++++++++++++++++++++++++++++ | 56% ~01h 02m 30s
|+++++++++++++++++++++++++++++ | 57% ~01h 00m 26s
|+++++++++++++++++++++++++++++ | 58% ~58m 26s
|++++++++++++++++++++++++++++++ | 59% ~56m 29s
|++++++++++++++++++++++++++++++ | 60% ~54m 34s
|+++++++++++++++++++++++++++++++ | 61% ~52m 46s
|+++++++++++++++++++++++++++++++ | 62% ~50m 57s
|++++++++++++++++++++++++++++++++ | 63% ~49m 11s
|++++++++++++++++++++++++++++++++ | 64% ~47m 25s
|+++++++++++++++++++++++++++++++++ | 65% ~45m 41s
|+++++++++++++++++++++++++++++++++ | 66% ~43m 60s
|++++++++++++++++++++++++++++++++++ | 67% ~42m 24s
|++++++++++++++++++++++++++++++++++ | 68% ~40m 47s
|+++++++++++++++++++++++++++++++++++ | 69% ~39m 12s
|+++++++++++++++++++++++++++++++++++ | 70% ~37m 39s
|++++++++++++++++++++++++++++++++++++ | 71% ~36m 07s
|++++++++++++++++++++++++++++++++++++ | 72% ~34m 37s
|+++++++++++++++++++++++++++++++++++++ | 73% ~33m 09s
|+++++++++++++++++++++++++++++++++++++ | 74% ~31m 45s
|++++++++++++++++++++++++++++++++++++++ | 75% ~30m 19s
|++++++++++++++++++++++++++++++++++++++ | 76% ~28m 54s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~27m 31s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~26m 09s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~24m 48s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~23m 30s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~22m 11s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~20m 53s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~19m 37s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~18m 21s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~17m 06s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~15m 52s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~14m 40s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~13m 28s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~12m 17s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~11m 06s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~09m 56s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~08m 47s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~07m 39s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~06m 32s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~05m 25s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~04m 19s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03m 13s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02m 08s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01m 04s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01h 45m 48s
head(da_peaks) # regions that are significant between young and aged samples
plot1 <- VlnPlot(
object = combined_data,
features = rownames(da_peaks)[1], # the peak to plot
pt.size = 0.1, # size of dots per cell
group.by = "sample" # groups to split cells by
)
plot2 <- FeaturePlot(
object = combined_data,
features = rownames(da_peaks)[1],
pt.size = 0.1,
max.cutoff = 'q95'
)
plot1 | plot2

# Find genes nearest to these significant regions
ClosestFeature(combined_data, regions = rownames(da_peaks))
NA
da_peaks$closest_gene <-ClosestFeature(combined_data, regions = rownames(da_peaks))$gene_name
da_peaks$distance <- ClosestFeature(combined_data, regions = rownames(da_peaks))$distance
head(da_peaks)
CoveragePlot(
object = combined_data,
region = rownames(da_peaks)[1],
extend.upstream = 10000,
extend.downstream = 5000,
group.by = "sample"
)

CoveragePlot(
object = combined_data,
region = rownames(da_peaks)[2],
extend.upstream = 10000,
extend.downstream = 5000,
group.by = "sample"
)

plot1 <- VlnPlot(
object = combined_data,
features = rownames(da_peaks)[1],
pt.size = 0.1,
group.by = "sample"
)
plot2 <- FeaturePlot(
object = combined_data,
features = rownames(da_peaks)[1],
pt.size = 0.1,
max.cutoff = 'q95'
)
plot1 | plot2

plot1 <- VlnPlot(
object = combined_data,
features = rownames(da_peaks)[2],
pt.size = 0.1,
group.by = "sample"
)
plot2 <- FeaturePlot(
object = combined_data,
features = rownames(da_peaks)[2],
pt.size = 0.1,
max.cutoff = 'q95'
)
plot1 | plot2

sessionInfo()
R version 4.4.3 (2025-02-28 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26100)
Matrix products: default
locale:
[1] LC_COLLATE=English_India.utf8 LC_CTYPE=English_India.utf8
[3] LC_MONETARY=English_India.utf8 LC_NUMERIC=C
[5] LC_TIME=English_India.utf8
time zone: Europe/Berlin
tzcode source: internal
attached base packages:
[1] stats4 stats graphics grDevices utils datasets methods base
other attached packages:
[1] future_1.67.0 EnsDb.Mmusculus.v79_2.99.0 ensembldb_2.30.0
[4] AnnotationFilter_1.30.0 GenomicFeatures_1.58.0 AnnotationDbi_1.68.0
[7] Biobase_2.66.0 GenomicRanges_1.58.0 GenomeInfoDb_1.42.3
[10] IRanges_2.40.1 S4Vectors_0.44.0 BiocGenerics_0.52.0
[13] BiocManager_1.30.26 patchwork_1.3.2 ggplot2_4.0.0
[16] Signac_1.16.0 Seurat_5.3.0 SeuratObject_5.2.0
[19] sp_2.2-0 hdf5r_1.3.12
loaded via a namespace (and not attached):
[1] RcppAnnoy_0.0.22 splines_4.4.3 later_1.4.4
[4] BiocIO_1.16.0 bitops_1.0-9 tibble_3.3.0
[7] polyclip_1.10-7 rpart_4.1.24 XML_3.99-0.19
[10] fastDummies_1.7.5 lifecycle_1.0.4 globals_0.18.0
[13] lattice_0.22-6 MASS_7.3-64 backports_1.5.0
[16] magrittr_2.0.4 sass_0.4.10 Hmisc_5.2-4
[19] plotly_4.11.0 rmarkdown_2.30 jquerylib_0.1.4
[22] yaml_2.3.10 httpuv_1.6.16 sctransform_0.4.2
[25] spam_2.11-1 spatstat.sparse_3.1-0 reticulate_1.43.0
[28] cowplot_1.2.0 pbapply_1.7-4 DBI_1.2.3
[31] RColorBrewer_1.1-3 abind_1.4-8 zlibbioc_1.52.0
[34] Rtsne_0.17 purrr_1.1.0 biovizBase_1.54.0
[37] RCurl_1.98-1.17 nnet_7.3-20 VariantAnnotation_1.52.0
[40] GenomeInfoDbData_1.2.13 ggrepel_0.9.6 irlba_2.3.5.1
[43] listenv_0.10.0 spatstat.utils_3.2-0 goftest_1.2-3
[46] RSpectra_0.16-2 spatstat.random_3.4-2 fitdistrplus_1.2-4
[49] parallelly_1.45.1 codetools_0.2-20 DelayedArray_0.32.0
[52] RcppRoll_0.3.1 tidyselect_1.2.1 UCSC.utils_1.2.0
[55] farver_2.1.2 base64enc_0.1-3 matrixStats_1.5.0
[58] spatstat.explore_3.5-3 GenomicAlignments_1.42.0 jsonlite_2.0.0
[61] Formula_1.2-5 progressr_0.17.0 ggridges_0.5.7
[64] survival_3.8-3 tools_4.4.3 ica_1.0-3
[67] Rcpp_1.1.0 glue_1.8.0 gridExtra_2.3
[70] SparseArray_1.6.2 xfun_0.53 MatrixGenerics_1.18.1
[73] dplyr_1.1.4 withr_3.0.2 fastmap_1.2.0
[76] digest_0.6.37 R6_2.6.1 mime_0.13
[79] colorspace_2.1-2 scattermore_1.2 tensor_1.5.1
[82] dichromat_2.0-0.1 spatstat.data_3.1-9 RSQLite_2.4.3
[85] tidyr_1.3.1 generics_0.1.4 data.table_1.17.8
[88] rtracklayer_1.66.0 httr_1.4.7 htmlwidgets_1.6.4
[91] S4Arrays_1.6.0 uwot_0.2.3 pkgconfig_2.0.3
[94] gtable_0.3.6 blob_1.2.4 lmtest_0.9-40
[97] S7_0.2.0 XVector_0.46.0 htmltools_0.5.8.1
[100] dotCall64_1.2 ProtGenerics_1.38.0 scales_1.4.0
[103] png_0.1-8 spatstat.univar_3.1-4 knitr_1.50
[106] rstudioapi_0.17.1 reshape2_1.4.4 rjson_0.2.23
[109] checkmate_2.3.3 nlme_3.1-167 curl_7.0.0
[112] zoo_1.8-14 cachem_1.1.0 stringr_1.5.2
[115] KernSmooth_2.23-26 parallel_4.4.3 miniUI_0.1.2
[118] foreign_0.8-88 restfulr_0.0.16 pillar_1.11.1
[121] grid_4.4.3 vctrs_0.6.5 RANN_2.6.2
[124] promises_1.3.3 xtable_1.8-4 cluster_2.1.8
[127] htmlTable_2.4.3 evaluate_1.0.5 cli_3.6.5
[130] compiler_4.4.3 Rsamtools_2.22.0 rlang_1.1.6
[133] crayon_1.5.3 future.apply_1.20.0 labeling_0.4.3
[136] plyr_1.8.9 stringi_1.8.7 viridisLite_0.4.2
[139] deldir_2.0-4 BiocParallel_1.40.0 Biostrings_2.74.1
[142] lazyeval_0.2.2 spatstat.geom_3.6-0 Matrix_1.7-4
[145] BSgenome_1.74.0 RcppHNSW_0.6.0 bit64_4.6.0-1
[148] KEGGREST_1.46.0 shiny_1.11.1 SummarizedExperiment_1.36.0
[151] ROCR_1.0-11 igraph_2.1.4 memoise_2.0.1
[154] bslib_0.9.0 fastmatch_1.1-6 bit_4.6.0
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJTaWduYWMiKSAjU2V1cmF0IGFkZG9uIGZvciBhbmFseXppbmcgY2hyb21hdGluDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGhkZjVyKSAjbmVlZCB0byByZWFkIGg1IGZpbGVzDQpsaWJyYXJ5KFNldXJhdCkNCmxpYnJhcnkoU2lnbmFjKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwYXRjaHdvcmspDQpgYGANCg0KYGBge3J9DQpzZXR3ZCgiQzpcXHNpbmdsZWNlbGxfYXRhYyIpDQpnZXR3ZCgpDQpgYGANCiMgUHJlLXByb2Nlc3Npbmcgd29ya2Zsb3cNCg0KYGBge3J9DQpjb3VudHMgPC0gUmVhZDEwWF9oNSgiR1NFMTkwNDI0X1JBV1xcQWdlZFxcR1NNNTcyMzYzMl9BZ2VkX0hTQ19maWx0ZXJlZF9wZWFrX2JjX21hdHJpeC5oNSIpDQpgYGANCg0KYGBge3J9DQojIGNvdW50cyBpcyBhIGZlYXR1cmUgYnkgY2VsbCBtYXRyaXgsIGhlcmUgZmVhdHVyZXMgYXJlIGNvb3JkaW5hdGVzIG9mIHBlYWtzLg0KY291bnRzICMgMTY3NzcxIGZlYXR1cmVzIHggMzY5NCBjZWxscw0KYGBgDQoNCmBgYHtyfQ0KbWV0YSA8LSByZWFkLmNzdigiR1NFMTkwNDI0X1JBV1xcQWdlZFxcR1NNNTcyMzYzMl9BZ2VkX0hTQ19zaW5nbGVjZWxsLmNzdi5neiIsDQogICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFLA0KICAgICAgICAgICAgICAgICByb3cubmFtZXMgPSAxKSANCg0KbWV0YQ0KYGBgDQoNCg0KYGBge3J9DQoNCiAgY2hyb21fYXNzYXkgPC0gQ3JlYXRlQ2hyb21hdGluQXNzYXkoDQogIGNvdW50cyA9IGNvdW50cywNCiAgc2VwID0gYygiOiIsICItIiksICMgZmVhdHVyZXMgKGNocjE6MzY3MDQ0NC0zNjcyNzUzLCBsb29rIGluIGNvdW50cykgYXJlIHNlcCBieSA6IGFuZCAsDQogIGdlbm9tZSA9ICdtbTEwJywgDQogIGZyYWdtZW50cyA9ICdHU0UxOTA0MjRfUkFXXFxBZ2VkXFxHU001NzIzNjMyX0FnZWRfSFNDX2ZyYWdtZW50cy50c3YuZ3onLA0KICBtaW4uY2VsbHMgPSAxMCwgIyBLZWVwIHBlYWtzIGZvdW5kIGluIOKJpTEwIGNlbGxzLg0KICBtaW4uZmVhdHVyZXMgPSAyMDAgIyBLZWVwIGNlbGxzIHdpdGgg4omlMjAwIHBlYWtzDQopDQpgYGANCg0KYGBge3J9DQojIE5vdGVzOg0KIyANCiMgTWFrZSBzdXJlIGZyYWdtZW50cyBhbmQgaXRzIGluZGV4IGFyZSBpbiBzYW1lIGZvbGRlcg0KIyBOYW1lcyBvZiBib3RoIGZpbGVzIHNob3VsZCBtYXRjaCBleGNlcHQgZm9yIHRoZSAudGJpDQojIGZvciBleGFtcGxlOiBzZWUgYmVsb3cNCmBgYA0KDQpgYGB7cn0NCmxpc3QuZmlsZXMoIkdTRTE5MDQyNF9SQVdcXEFnZWQiKQ0KYGBgDQoNCg0KYGBge3J9DQoNCmRhdGEgPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KA0KICBjb3VudHMgPSBjaHJvbV9hc3NheSwNCiAgYXNzYXkgPSAicGVha3MiLA0KICBtZXRhLmRhdGEgPSBtZXRhDQopDQpgYGANCg0KDQpgYGB7cn0NCmRhdGENCmBgYA0KYGBge3J9DQpkYXRhW1tdXQ0KYGBgDQoNCmBgYHtyfQ0KDQppZiAoIXJlcXVpcmUoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikNCg0KQmlvY01hbmFnZXI6Omluc3RhbGwoIkVuc0RiLk1tdXNjdWx1cy52NzkiKSAjIEVuc0RiLkhzYXBpZW5zLnY4NiBmb3IgaHVtYW4NCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJHZW5vbWVJbmZvRGIiKSAjdHJhbnNsYXRpb24gYmV0d2VlbiBjaHJvbW9zb21lIG5hbWVzDQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgiYmlvdml6QmFzZSIpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KEVuc0RiLk1tdXNjdWx1cy52NzkpDQpsaWJyYXJ5KEdlbm9tZUluZm9EYikNCmBgYA0KDQpgYGB7cn0NCiMgZ2V0IGFsbCBhbm5vdGF0ZWQgbW91c2UgZ2VuZXMgZnJvbSBFbnNlbWJsLWJhc2VkIGFubm90YXRpb24gZGF0YWJhc2UNCg0KYW5ub3RhdGlvbnMgPC0gR2V0R1Jhbmdlc0Zyb21FbnNEYihlbnNkYiA9IEVuc0RiLk1tdXNjdWx1cy52NzkpDQpzZXFsZXZlbHNTdHlsZShhbm5vdGF0aW9ucykgPC0gJ1VDU0MnDQoNCiMgTm90ZTogZmVhdHVyZXMgaGF2ZSBjaHIxIHByZWZpeCB3aGljaCBpcyBVQ1NDLXN0eWxlIGNocm9tb3NvbWUgbmFtZXMuIA0KYGBgDQoNCmBgYHtyfQ0KYW5ub3RhdGlvbnMNCmBgYA0KDQpgYGB7cn0NCkFubm90YXRpb24oZGF0YSkgPC0gYW5ub3RhdGlvbnMNCmBgYA0KDQojIENvbXB1dGluZyBRQyBNZXRyaWNzDQoNCmBgYHtyfQ0KIyAxLiBMb29rIGF0IHRoZSBmcmFnbWVudCBsZW5ndGggcGVyaW9kaWNpdHkgZm9yIGFsbCB0aGUgY2VsbHMNCmRhdGEgPC0gTnVjbGVvc29tZVNpZ25hbChvYmplY3QgPSBkYXRhKQ0KYGBgDQpgYGB7cn0NCiMgTm90ZToNCiMgU2lnbmFjIGxvb2tzIGF0IGFsbCBmcmFnbWVudHMgaW4gZWFjaCBjZWxsIGFuZCBiaW5zIHRoZW0gYnkgbGVuZ3RoOg0KIyBGcmFnbWVudCBsZW5ndGggIENhdGVnb3J5DQojIDDigJMxMDAgYnAJTnVjbGVvc29tZS1mcmVlIChORlIpDQojIDE4MOKAkzI0NyBicAlNb25vbnVjbGVvc29tYWwNCiMgMzE14oCTNDczIGJwCURpbnVjbGVvc29tYWwNCiMgLi4uLi4uLi4uICAgLi4uLi4uLi4uLi4uLg0KDQojIFRoZW4gY2FsY3VsYXRlIG1vbm9udWNsZW9zb21hbC8gbnVjbGVvc29tZS1mcmVlIHJhdGlvDQoNCiAgDQpgYGANCg0KYGBge3J9DQpkYXRhJG51Y2xlb3NvbWVfZ3JvdXAgPC0gaWZlbHNlKGRhdGEkbnVjbGVvc29tZV9zaWduYWwgPiA0LCAnTlMgPiA0JywgJ05TIDwgNCcpDQp1bmlxdWUoZGF0YSRudWNsZW9zb21lX2dyb3VwKQ0KDQojIG5vIGxvdy1xdWFsaXR5IGNlbGxzIGRvbWluYXRlZCBieSBtb25vbnVjbGVvc29tYWwgZnJhZ21lbnRzLg0KYGBgDQoNCmBgYHtyfQ0KRnJhZ21lbnRIaXN0b2dyYW0ob2JqZWN0ID0gZGF0YSwgDQogICAgICAgICAgICAgICAgICBncm91cC5ieSA9ICdudWNsZW9zb21lX2dyb3VwJywgDQogICAgICAgICAgICAgICAgICByZWdpb24gPSAnY2hyMS0xLTEwMDAwMDAwJykNCg0KI05vdGU6DQojIGNlbGxzIGV4aGliaXQgYSBwYXR0ZXJuIHRoYXQgaXMgdHlwaWNhbCBmb3IgYSBzdWNjZXNzZnVsIEFUQUMtc2VxIGV4cGVyaW1lbnQuDQoNCmBgYA0KDQpgYGB7cn0NCiMgMi4gQ2FsY3VsYXRlIHRoZSBUU1MgZW5yaWNobWVudCBzY29yZSBmb3IgZWFjaCBjZWxsDQpkYXRhIDwtIFRTU0VucmljaG1lbnQoZGF0YSwgZmFzdCA9IEZBTFNFKQ0KYGBgDQoNCg0KYGBge3J9DQojIDMuIENvbXB1dGUgZnJhY3Rpb24gb2YgcmVhZHMgZnJvbSBibGFja2xpc3RlZCByZWdpb24NCiMgaW4gZGF0YVtbXV0gdGhlcmUgaXMgYSBjb2x1bW4gYmxhY2tsaXN0X3JlZ2lvbl9mcmFnbWVudHMNCiMgbnVtYmVyIG9mIGZyYWdtZW50cyBtYXBwZWQgdG8gYmxhY2sgbGlzdCByZWdpb25zDQpkYXRhJGJsYWNrbGlzdF9yYXRpbyA8LSBkYXRhJGJsYWNrbGlzdF9yZWdpb25fZnJhZ21lbnRzIC8gZGF0YSRwZWFrX3JlZ2lvbl9mcmFnbWVudHMNCmBgYA0KDQpgYGB7cn0NCmRhdGEkcGN0X3JlYWRzX2luX3BlYWtzIDwtIGRhdGEkcGVha19yZWdpb25fZnJhZ21lbnRzIC8gZGF0YSRwYXNzZWRfZmlsdGVycyAqIDEwMCANCmBgYA0KDQoNCmBgYHtyfQ0KdmxuIDwtIFZsblBsb3QoDQogIG9iamVjdCA9IGRhdGEsDQogIGZlYXR1cmVzID0gYygncGVha19yZWdpb25fZnJhZ21lbnRzJywgJ3BjdF9yZWFkc19pbl9wZWFrcycsIA0KICAgICAgICAgICAgICAgICdibGFja2xpc3RfcmF0aW8nLCAnbnVjbGVvc29tZV9zaWduYWwnLCAnVFNTLmVucmljaG1lbnQnKSwNCiAgcHQuc2l6ZSA9IDAuMSwNCiAgbmNvbCA9IDUNCikNCnZsbg0KYGBgDQoNCiMgUmVtb3ZlIGNlbGxzIHRoYXQgYXJlIG91dGxpZXJzIGZvciB0aGVzZSBRQyBtZXRyaWNzDQoNCmBgYHtyfQ0KZGF0YQ0KYGBgDQoNCmBgYHtyfQ0KIyBvcHRpb24gMTogU2V0IG1hbnVhbCB0aHJlc2hvbGRzYmFzZWQgb24gdGhlIHZpb2xpbiBwbG90IA0KZGF0YV9maWx0ZXJlZCA8LSBzdWJzZXQoDQogIHggPSBkYXRhLA0KICBzdWJzZXQgPSBwZWFrX3JlZ2lvbl9mcmFnbWVudHMgPiAzMDAwICYNCiAgICBwZWFrX3JlZ2lvbl9mcmFnbWVudHMgPCA0MDAwMCAmDQogICAgcGN0X3JlYWRzX2luX3BlYWtzID4gNjAgJg0KICAgIGJsYWNrbGlzdF9yYXRpbyA8IDAuMDIgJg0KICAgIG51Y2xlb3NvbWVfc2lnbmFsIDwgNCAmIA0KICAgIFRTUy5lbnJpY2htZW50ID4gMg0KKQ0KDQpkYXRhX2ZpbHRlcmVkDQpgYGANCmBgYHtyfQ0KIyBPcHRpb24gMjogQmFzZWQgb24gcXVhbnRpbGVzDQpsb3dfcHJmIDwtIHF1YW50aWxlKGRhdGFbWyJwZWFrX3JlZ2lvbl9mcmFnbWVudHMiXV0kcGVha19yZWdpb25fZnJhZ21lbnRzLCBwcm9icyA9IDAuMDIpDQpoaWdfcHJmIDwtIHF1YW50aWxlKGRhdGFbWyJwZWFrX3JlZ2lvbl9mcmFnbWVudHMiXV0kcGVha19yZWdpb25fZnJhZ21lbnRzLCBwcm9icyA9IDAuOTgpDQoNCmxvd19wcnAgPC0gcXVhbnRpbGUoZGF0YVtbInBjdF9yZWFkc19pbl9wZWFrcyJdXSRwY3RfcmVhZHNfaW5fcGVha3MsIHByb2JzID0gMC4wMikNCg0KaGlnaF9ibHIgPC0gcXVhbnRpbGUoZGF0YVtbImJsYWNrbGlzdF9yYXRpbyJdXSRibGFja2xpc3RfcmF0aW8sIHByb2JzID0gMC45OCkNCg0KaGlnX25zIDwtIHF1YW50aWxlKGRhdGFbWyJudWNsZW9zb21lX3NpZ25hbCJdXSRudWNsZW9zb21lX3NpZ25hbCwgcHJvYnMgPSAwLjk4KQ0KDQpsb3dfdHMgPC0gcXVhbnRpbGUoZGF0YVtbIlRTUy5lbnJpY2htZW50Il1dJFRTUy5lbnJpY2htZW50LCBwcm9icyA9IDAuMDIpDQpgYGANCg0KYGBge3J9DQpwcmludChsb3dfcHJmKQ0KcHJpbnQoaGlnX3ByZikNCnByaW50KGxvd19wcnApDQpwcmludChoaWdoX2JscikNCnByaW50KGhpZ19ucykNCnByaW50KGxvd190cykNCmBgYA0KDQpgYGB7cn0NCmRhdGEgPC0gc3Vic2V0KA0KICB4ID0gZGF0YSwNCiAgc3Vic2V0ID0gcGVha19yZWdpb25fZnJhZ21lbnRzID4gbG93X3ByZiAmDQogICAgcGVha19yZWdpb25fZnJhZ21lbnRzIDwgaGlnX3ByZiAmDQogICAgcGN0X3JlYWRzX2luX3BlYWtzID4gbG93X3BycCAmDQogICAgYmxhY2tsaXN0X3JhdGlvIDwgaGlnaF9ibHIgJg0KICAgIG51Y2xlb3NvbWVfc2lnbmFsIDwgaGlnX25zICYNCiAgICBUU1MuZW5yaWNobWVudCA+IGxvd190cw0KKQ0KZGF0YQ0KYGBgDQojIE5vcm1hbGl6YXRpb24gYW5kIGxpbmVhciBkaW1lbnNpb25hbCByZWR1Y3Rpb24NCg0KYGBge3J9DQpkYXRhIDwtIFJ1blRGSURGKGRhdGEpDQpgYGANCg0KYGBge3J9DQpkYXRhIDwtIEZpbmRUb3BGZWF0dXJlcyhkYXRhLCBtaW4uY3V0b2ZmID0gJ3EwJykNCmRhdGENCmBgYA0KDQpgYGB7cn0NCmRhdGEgPC0gUnVuU1ZEKGRhdGEpDQpgYGANCg0KYGBge3J9DQpEZXB0aENvcihkYXRhKQ0KYGBgDQpgYGB7cn0NCiMgTm90ZToNCiMgQ29tcG9uZW50IDEgaXMgc3Ryb25nbHkgY29ycmVsYXRlZCB0byBzZXF1ZW5jaW5nIGRlcHRoICAodGVjaG5pY2FsIHZhcmlhdGlvbikuDQojIHJhdGhlciB0aGFuIGJpb2xvZ2ljYWwgdmFyaWF0aW9uDQojIFJlbW92ZSB0aGlzIGNvbXBvbmVudA0KYGBgDQoNCiMgTm9uLWxpbmVhciBkaW1lbnNpb24gcmVkdWN0aW9uIGFuZCBjbHVzdGVyaW5nDQoNCmBgYHtyfQ0KZGF0YSA8LSBSdW5VTUFQKA0KICBvYmplY3QgPSBkYXRhLA0KICByZWR1Y3Rpb24gPSAnbHNpJywNCiAgZGltcyA9IDI6MzANCikNCg0KZGF0YSA8LSBGaW5kTmVpZ2hib3JzKA0KICBvYmplY3QgPSBkYXRhLA0KICByZWR1Y3Rpb24gPSAnbHNpJywNCiAgZGltcyA9IDI6MzANCikNCg0KZGF0YSA8LSBGaW5kQ2x1c3RlcnMoDQogIG9iamVjdCA9IGRhdGEsDQogIGFsZ29yaXRobSA9IDMsDQogIHZlcmJvc2UgPSBGQUxTRQ0KKQ0KDQpgYGANCg0KDQpgYGB7cn0NCkRpbVBsb3Qob2JqZWN0ID0gZGF0YSwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMSkgKyBOb0xlZ2VuZCgpDQpgYGANCg0KYGBge3J9DQojIFVzaW5nIGRhdGFfZmlsdGVyZWQNCg0KZGF0YV9maWx0ZXJlZCA8LSBSdW5URklERihkYXRhX2ZpbHRlcmVkKQ0KZGF0YV9maWx0ZXJlZCA8LSBGaW5kVG9wRmVhdHVyZXMoZGF0YV9maWx0ZXJlZCwgbWluLmN1dG9mZiA9ICdxMCcpDQpkYXRhX2ZpbHRlcmVkIDwtIFJ1blNWRChvYmplY3QgPSBkYXRhX2ZpbHRlcmVkKQ0KDQpEZXB0aENvcihkYXRhX2ZpbHRlcmVkKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9maWx0ZXJlZCA8LSBSdW5VTUFQKA0KICBvYmplY3QgPSBkYXRhX2ZpbHRlcmVkLA0KICByZWR1Y3Rpb24gPSAnbHNpJywNCiAgZGltcyA9IDI6MzANCikNCmRhdGFfZmlsdGVyZWQgPC0gRmluZE5laWdoYm9ycygNCiAgb2JqZWN0ID0gZGF0YV9maWx0ZXJlZCwNCiAgcmVkdWN0aW9uID0gJ2xzaScsDQogIGRpbXMgPSAyOjMwDQopDQpkYXRhX2ZpbHRlcmVkIDwtIEZpbmRDbHVzdGVycygNCiAgb2JqZWN0ID0gZGF0YV9maWx0ZXJlZCwNCiAgYWxnb3JpdGhtID0gMywNCiAgcmVzb2x1dGlvbiA9IDEuMiwNCiAgdmVyYm9zZSA9IEZBTFNFDQopDQoNCkRpbVBsb3Qob2JqZWN0ID0gZGF0YV9maWx0ZXJlZCwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMSkgKyBOb0xlZ2VuZCgpDQpgYGANCg0KYGBge3J9DQojIE5vdGU6DQojIE9uZSBwcmltYXJ5IGNsdXN0ZXIgLSBiZWNhdXNlIGRhdGEgaXMgZnJvbSBhZ2VkIG1pY2UNCiMgTWFueSBzdWJjbHN1dGVycyB3aXRoaW4gbWFpbiBjbHVzdGVyDQpgYGANCg0KIyBNdWx0aXBsZSBzYW1wbGVzDQoNCmBgYHtyfQ0KIyBGdW5jdGlvbiB3aXRoIGFsbCB0aGUgcHJlcHJvY2Vzc2luZyBzdGVwcyBhbmQgaW5mb3JtYXRpdmUgcHJpbnQgbWVzc2FnZXMNCnByZXBhcmVfZGF0YSA8LSBmdW5jdGlvbihjb3VudF9wYXRoLCBtZXRhX3BhdGgsIGZyYWdtZW50X3BhdGgpew0KICANCiAgbWVzc2FnZSgiU3RlcCAxOiBSZWFkaW5nIGNvdW50IGRhdGEuLi4iKQ0KICBjb3VudHMgPC0gUmVhZDEwWF9oNShjb3VudF9wYXRoKQ0KICBtZXNzYWdlKCJDb3VudCBkYXRhIGxvYWRlZCBzdWNjZXNzZnVsbHkuIikNCiAgDQogIG1lc3NhZ2UoIlN0ZXAgMjogUmVhZGluZyBtZXRhZGF0YS4uLiIpDQogIG1ldGEgPC0gcmVhZC5jc3YobWV0YV9wYXRoLA0KICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgcm93Lm5hbWVzID0gMSkNCiAgbWVzc2FnZSgiTWV0YWRhdGEgbG9hZGVkIHN1Y2Nlc3NmdWxseS4iKQ0KICANCiAgbWVzc2FnZSgiU3RlcCAzOiBDcmVhdGluZyBDaHJvbWF0aW5Bc3NheSBvYmplY3QuLi4iKQ0KICBjaHJvbV9hc3NheSA8LSBDcmVhdGVDaHJvbWF0aW5Bc3NheSgNCiAgICBjb3VudHMgPSBjb3VudHMsDQogICAgc2VwID0gYygiOiIsICItIiksDQogICAgZ2Vub21lID0gJ21tMTAnLA0KICAgIGZyYWdtZW50cyA9IGZyYWdtZW50X3BhdGgsDQogICAgbWluLmNlbGxzID0gMTAsDQogICAgbWluLmZlYXR1cmVzID0gMjAwDQogICkNCiAgbWVzc2FnZSgiQ2hyb21hdGluQXNzYXkgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIikNCiAgDQogIG1lc3NhZ2UoIlN0ZXAgNDogQ3JlYXRpbmcgU2V1cmF0IG9iamVjdC4uLiIpDQogIGRhdGEgPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KA0KICAgIGNvdW50cyA9IGNocm9tX2Fzc2F5LA0KICAgIGFzc2F5ID0gInBlYWtzIiwNCiAgICBtZXRhLmRhdGEgPSBtZXRhDQogICkNCiAgbWVzc2FnZSgiU2V1cmF0IG9iamVjdCBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4iKQ0KICANCiAgbWVzc2FnZSgiU3RlcCA1OiBBbm5vdGF0aW5nIGRhdGEuLi4iKQ0KICBBbm5vdGF0aW9uKGRhdGEpIDwtIGFubm90YXRpb25zDQogIG1lc3NhZ2UoIkFubm90YXRpb24gY29tcGxldGVkLiIpDQogIA0KICBtZXNzYWdlKCJTdGVwIDY6IENvbXB1dGluZyBRQyBtZXRyaWNzIChudWNsZW9zb21lIHNpZ25hbCwgVFNTIGVucmljaG1lbnQsIGJsYWNrbGlzdCByYXRpbywgJSByZWFkcyBpbiBwZWFrcykuLi4iKQ0KICBkYXRhIDwtIE51Y2xlb3NvbWVTaWduYWwob2JqZWN0ID0gZGF0YSkNCiAgZGF0YSA8LSBUU1NFbnJpY2htZW50KG9iamVjdCA9IGRhdGEsIGZhc3QgPSBGQUxTRSkNCiAgZGF0YSRibGFja2xpc3RfcmF0aW8gPC0gZGF0YSRibGFja2xpc3RfcmVnaW9uX2ZyYWdtZW50cyAvIGRhdGEkcGVha19yZWdpb25fZnJhZ21lbnRzDQogIGRhdGEkcGN0X3JlYWRzX2luX3BlYWtzIDwtIGRhdGEkcGVha19yZWdpb25fZnJhZ21lbnRzIC8gZGF0YSRwYXNzZWRfZmlsdGVycyAqIDEwMA0KICBtZXNzYWdlKCJRQyBtZXRyaWNzIGNvbXB1dGF0aW9uIGNvbXBsZXRlZC4iKQ0KICANCiAgbWVzc2FnZSgiU3RlcCA3OiBDYWxjdWxhdGluZyBmaWx0ZXJpbmcgdGhyZXNob2xkcy4uLiIpDQogIGxvd19wcmYgPC0gcXVhbnRpbGUoZGF0YVtbInBlYWtfcmVnaW9uX2ZyYWdtZW50cyJdXSRwZWFrX3JlZ2lvbl9mcmFnbWVudHMsIHByb2JzID0gMC4wMikNCiAgaGlnX3ByZiA8LSBxdWFudGlsZShkYXRhW1sicGVha19yZWdpb25fZnJhZ21lbnRzIl1dJHBlYWtfcmVnaW9uX2ZyYWdtZW50cywgcHJvYnMgPSAwLjk4KQ0KICBsb3dfcHJwIDwtIHF1YW50aWxlKGRhdGFbWyJwY3RfcmVhZHNfaW5fcGVha3MiXV0kcGN0X3JlYWRzX2luX3BlYWtzLCBwcm9icyA9IDAuMDIpDQogIGhpZ2hfYmxyIDwtIHF1YW50aWxlKGRhdGFbWyJibGFja2xpc3RfcmF0aW8iXV0kYmxhY2tsaXN0X3JhdGlvLCBwcm9icyA9IDAuOTgpDQogIGhpZ19ucyA8LSBxdWFudGlsZShkYXRhW1sibnVjbGVvc29tZV9zaWduYWwiXV0kbnVjbGVvc29tZV9zaWduYWwsIHByb2JzID0gMC45OCkNCiAgbG93X3RzIDwtIHF1YW50aWxlKGRhdGFbWyJUU1MuZW5yaWNobWVudCJdXSRUU1MuZW5yaWNobWVudCwgcHJvYnMgPSAwLjAyKQ0KICBtZXNzYWdlKCJGaWx0ZXJpbmcgdGhyZXNob2xkcyBjYWxjdWxhdGVkLiIpDQogIA0KICBtZXNzYWdlKCJTdGVwIDg6IEZpbHRlcmluZyBkYXRhIGJhc2VkIG9uIFFDIHRocmVzaG9sZHMuLi4iKQ0KICBkYXRhIDwtIHN1YnNldCgNCiAgICB4ID0gZGF0YSwNCiAgICBzdWJzZXQgPSBwZWFrX3JlZ2lvbl9mcmFnbWVudHMgPiBsb3dfcHJmICYNCiAgICAgIHBlYWtfcmVnaW9uX2ZyYWdtZW50cyA8IGhpZ19wcmYgJg0KICAgICAgcGN0X3JlYWRzX2luX3BlYWtzID4gbG93X3BycCAmDQogICAgICBibGFja2xpc3RfcmF0aW8gPCBoaWdoX2JsciAmDQogICAgICBudWNsZW9zb21lX3NpZ25hbCA8IGhpZ19ucyAmDQogICAgICBUU1MuZW5yaWNobWVudCA+IGxvd190cw0KICApDQogIG1lc3NhZ2UoIkRhdGEgZmlsdGVyaW5nIGNvbXBsZXRlZC4iKQ0KICANCiAgbWVzc2FnZSgiQWxsIHByZXByb2Nlc3Npbmcgc3RlcHMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKQ0KICANCiAgcmV0dXJuKGRhdGEpDQp9DQoNCmBgYA0KDQoNCmBgYHtyfQ0KYWdlZCA8LSBwcmVwYXJlX2RhdGEoIkdTRTE5MDQyNF9SQVdcXEFnZWRcXEdTTTU3MjM2MzJfQWdlZF9IU0NfZmlsdGVyZWRfcGVha19iY19tYXRyaXguaDUiLA0KICAgICAgICAgICAgICAgICAgICAgIkdTRTE5MDQyNF9SQVdcXEFnZWRcXEdTTTU3MjM2MzJfQWdlZF9IU0Nfc2luZ2xlY2VsbC5jc3YuZ3oiLA0KICAgICAgICAgICAgICAgICAgICAgIkdTRTE5MDQyNF9SQVdcXEFnZWRcXEdTTTU3MjM2MzJfQWdlZF9IU0NfZnJhZ21lbnRzLnRzdi5neiINCiAgICAgICAgICAgICAgICAgICAgICkNCmBgYA0KYGBge3J9DQp5b3VuZyA8LSBwcmVwYXJlX2RhdGEoIkdTRTE5MDQyNF9SQVdcXFlvdW5nXFxHU001NzIzNjMxX1lvdW5nX0hTQ19maWx0ZXJlZF9wZWFrX2JjX21hdHJpeC5oNSIsDQogICAgICAgICAgICAgICAgICAgICAiR1NFMTkwNDI0X1JBV1xcWW91bmdcXEdTTTU3MjM2MzFfWW91bmdfSFNDX3NpbmdsZWNlbGwuY3N2Lmd6IiwNCiAgICAgICAgICAgICAgICAgICAgICJHU0UxOTA0MjRfUkFXXFxZb3VuZ1xcR1NNNTcyMzYzMV9Zb3VuZ19IU0NfZnJhZ21lbnRzLnRzdi5neiINCiAgICAgICAgICAgICAgICAgICAgICkNCmBgYA0KDQpgYGB7cn0NCiMgQWRkIG5ldyBjb2x1bW4gdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHNhbXBsZSBhZ2VkIGFuZCB5b3VuZw0KeW91bmckc2FtcGxlIDwtICJ5b3VuZyINCmFnZWQkc2FtcGxlIDwtICJhZ2VkIg0KYGBgDQoNCmBgYHtyfQ0KYWdlZFtbXV0NCnlvdW5nW1tdXQ0KYGBgDQoNCg0KYGBge3J9DQpjb21iaW5lZF9kYXRhIDwtIG1lcmdlKHlvdW5nLCBhZ2VkKQ0KYGBgDQoNCmBgYHtyfQ0KY29tYmluZWRfZGF0YSA8LSBSdW5URklERihjb21iaW5lZF9kYXRhKQ0KY29tYmluZWRfZGF0YSA8LSBGaW5kVG9wRmVhdHVyZXMoY29tYmluZWRfZGF0YSwgbWluLmN1dG9mZiA9ICdxMCcpDQpjb21iaW5lZF9kYXRhIDwtIFJ1blNWRChvYmplY3QgPSBjb21iaW5lZF9kYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KRGVwdGhDb3IoY29tYmluZWRfZGF0YSkNCmBgYA0KDQpgYGB7cn0NCmNvbWJpbmVkX2RhdGEgPC0gUnVuVU1BUChvYmplY3QgPSBjb21iaW5lZF9kYXRhLCByZWR1Y3Rpb24gPSAnbHNpJywgZGltcyA9IDI6MzApDQpjb21iaW5lZF9kYXRhIDwtIEZpbmROZWlnaGJvcnMob2JqZWN0ID0gY29tYmluZWRfZGF0YSwgcmVkdWN0aW9uID0gJ2xzaScsIGRpbXMgPSAyOjMwKQ0KYGBgDQoNCmBgYHtyfQ0KY29tYmluZWRfZGF0YSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gY29tYmluZWRfZGF0YSwgdmVyYm9zZSA9IEZBTFNFLCBhbGdvcml0aG0gPSAzLCByZXNvbHV0aW9uID0gLjQpDQpgYGANCg0KDQpgYGB7cn0NCkRpbVBsb3Qob2JqZWN0ID0gY29tYmluZWRfZGF0YSwgbGFiZWwgPSBUUlVFKSArIE5vTGVnZW5kKCkNCmBgYA0KDQpgYGB7cn0NCkRpbVBsb3Qob2JqZWN0ID0gY29tYmluZWRfZGF0YSwgbGFiZWwgPSBUUlVFLCBncm91cC5ieSA9ICJzYW1wbGUiKSArIE5vTGVnZW5kKCkNCmBgYA0KDQojIERhdGEgQW5hbHlzaXMNCg0KYGBge3J9DQojIDEuIENyZWF0ZSBhIGdlbmUgYWN0aXZpdHkgbWF0cml4IG9yIHNjb3Jlcw0KIyBFc3RpbWF0ZSBnZW5lIGV4cHJlc3Npb24tbGlrZSB2YWx1ZXMgZnJvbSBvcGVuIGNocm9tYXRpbiByZWdpb25zIChwZWFrcykNCiMgRWFjaCBlbnRyeSBlcHJlc2VudHMgdGhlIGdlbmUgYWN0aXZpdHkgc2NvcmUgZm9yIHRoYXQgZ2VuZSBpbiB0aGF0IGNlbGwuDQoNCmdlbmUuYWN0aXZpdGllcyA8LSBHZW5lQWN0aXZpdHkoY29tYmluZWRfZGF0YSkNCmBgYA0KDQpgYGB7cn0NCiMgZ2VuZS5hY3Rpdml0aWVzDQojIGFkZCB0aGUgZ2VuZSBhY3Rpdml0eSBtYXRyaXggdG8gdGhlIFNldXJhdCBvYmplY3QgYXMgYSBuZXcgYXNzYXkNCmNvbWJpbmVkX2RhdGFbWydSTkEnXV0gPC0gQ3JlYXRlQXNzYXlPYmplY3QoY291bnRzID0gZ2VuZS5hY3Rpdml0aWVzKQ0KDQpgYGANCg0KYGBge3J9DQojIE5vcm1hbGl6ZQ0KY29tYmluZWRfZGF0YSA8LSBOb3JtYWxpemVEYXRhKA0KICBvYmplY3QgPSBjb21iaW5lZF9kYXRhLA0KICBhc3NheSA9ICdSTkEnLA0KICBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICdMb2dOb3JtYWxpemUnLA0KICBzY2FsZS5mYWN0b3IgPSBtZWRpYW4oY29tYmluZWRfZGF0YSRuQ291bnRfUk5BKQ0KKQ0KYGBgDQpgYGB7cn0NCmNvbWJpbmVkX2RhdGFbWyJSTkEiXV0NCmBgYA0KDQpgYGB7cn0NCmNvbWJpbmVkX2RhdGFbWyJwZWFrcyJdXQ0KYGBgDQpgYGB7cn0NCmNvbWJpbmVkX2RhdGENCmBgYA0KDQoNCmBgYHtyfQ0KRGVmYXVsdEFzc2F5KGNvbWJpbmVkX2RhdGEpDQpgYGANCmBgYHtyfQ0KIyBTZXQgUk5BIGFzIGRlZmF1bHQgYXNzYXkgDQpEZWZhdWx0QXNzYXkoY29tYmluZWRfZGF0YSkgPC0gJ1JOQScNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQbGl0IGV4cHJlc3Npb24gb2YgZ2VuZXMgaW4gZWFjaCBjbHVzdGVyDQoNCkZlYXR1cmVQbG90KA0KICBvYmplY3QgPSBjb21iaW5lZF9kYXRhLA0KICBmZWF0dXJlcyA9IGMoIkhuZjRnIiwgIlpmaHg0IiwgIlBleDIiLCAiUGtpYSIpLA0KICBtYXguY3V0b2ZmID0gJ3E5NScsDQopDQpgYGANCg0KYGBge3J9DQojIFNldCBkZWZhdWx0IGFzc2F5IGJhY2sgdG8gcGVha3MNCkRlZmF1bHRBc3NheShjb21iaW5lZF9kYXRhKSA8LSAncGVha3MnDQpgYGANCg0KDQojIEZpbmQgZGlmZmVyZW50aWFsbHkgYWNjZXNzaWJsZSBwZWFrcyBiZXR3ZWVuIGNsdXN0ZXJzDQoNCmBgYHtyfQ0KIyBwZWFrX3JlZ2lvbl9mcmFnbWVudHM6IHRvdGFsIG51bWJlciBvZiByZWFkcyBvdmVybGFwcGluZyBhbnkgcGVhayBwZXIgY2VsbA0KIyByZWZsZWN0cyBzZXF1ZW5jaW5nIGRlcHRoDQojIGxhdGVudC52YXJzID0gJ3BlYWtfcmVnaW9uX2ZyYWdtZW50cycgYWRqdXN0cyBmb3IgcGVha19yZWdpb25fZnJhZ21lbnRzDQojIFRoaXMgcmVtb3ZlIGJpYXMgZnJvbSBjZWxscyB3aXRoIGhpZ2hlci9sb3dlciBkZXB0aA0KDQojIG1pbi5wY3QgPSAwLjA1IC0gb25seSB0ZXN0IHBlYWtzIHByZXNlbnQgaW4g4omlNSUgb2YgY2VsbHMgaW4gZWl0aGVyIGdyb3VwDQoNCmRhX3BlYWtzIDwtIEZpbmRNYXJrZXJzKA0KICBvYmplY3QgPSBjb21iaW5lZF9kYXRhLA0KICBpZGVudC4xID0gcm93bmFtZXMoY29tYmluZWRfZGF0YVtbXV1bY29tYmluZWRfZGF0YSRzYW1wbGUgPT0gImFnZWQiLF0pLA0KICBpZGVudC4yID0gcm93bmFtZXMoY29tYmluZWRfZGF0YVtbXV1bY29tYmluZWRfZGF0YSRzYW1wbGUgPT0gInlvdW5nIixdKSwNCiAgbWluLnBjdCA9IDAuMDUsIyANCiAgdGVzdC51c2UgPSAnTFInLA0KICBsYXRlbnQudmFycyA9ICdwZWFrX3JlZ2lvbl9mcmFnbWVudHMnDQopDQpgYGANCmBgYHtyfQ0KaGVhZChkYV9wZWFrcykgIyByZWdpb25zIHRoYXQgYXJlIHNpZ25pZmljYW50IGJldHdlZW4geW91bmcgYW5kIGFnZWQgc2FtcGxlcw0KYGBgDQoNCg0KYGBge3J9DQpwbG90MSA8LSBWbG5QbG90KA0KICBvYmplY3QgPSBjb21iaW5lZF9kYXRhLA0KICBmZWF0dXJlcyA9IHJvd25hbWVzKGRhX3BlYWtzKVsxXSwgICAgICAgICAgICAgDQogIHB0LnNpemUgPSAwLjEsICAgICAgICAgICAgICAgICAgIA0KICBncm91cC5ieSA9ICJzYW1wbGUiICAgICAgICAgICAgIA0KKQ0KDQpwbG90MiA8LSBGZWF0dXJlUGxvdCgNCiAgb2JqZWN0ID0gY29tYmluZWRfZGF0YSwNCiAgZmVhdHVyZXMgPSByb3duYW1lcyhkYV9wZWFrcylbMV0sDQogIHB0LnNpemUgPSAwLjEsDQogIG1heC5jdXRvZmYgPSAncTk1Jw0KKQ0KcGxvdDEgfCBwbG90Mg0KDQpgYGANCg0KDQpgYGB7cn0NCiMgRmluZCBnZW5lcyBuZWFyZXN0IHRvIHRoZXNlIHNpZ25pZmljYW50IHJlZ2lvbnMNCkNsb3Nlc3RGZWF0dXJlKGNvbWJpbmVkX2RhdGEsIHJlZ2lvbnMgPSByb3duYW1lcyhkYV9wZWFrcykpDQoNCmBgYA0KDQpgYGB7cn0NCmRhX3BlYWtzJGNsb3Nlc3RfZ2VuZSA8LUNsb3Nlc3RGZWF0dXJlKGNvbWJpbmVkX2RhdGEsIHJlZ2lvbnMgPSByb3duYW1lcyhkYV9wZWFrcykpJGdlbmVfbmFtZQ0KZGFfcGVha3MkZGlzdGFuY2UgPC0gQ2xvc2VzdEZlYXR1cmUoY29tYmluZWRfZGF0YSwgcmVnaW9ucyA9IHJvd25hbWVzKGRhX3BlYWtzKSkkZGlzdGFuY2UNCmBgYA0KDQpgYGB7cn0NCmhlYWQoZGFfcGVha3MpDQpgYGANCg0KYGBge3J9DQpDb3ZlcmFnZVBsb3QoDQogIG9iamVjdCA9IGNvbWJpbmVkX2RhdGEsDQogIHJlZ2lvbiA9IHJvd25hbWVzKGRhX3BlYWtzKVsxXSwNCiAgZXh0ZW5kLnVwc3RyZWFtID0gMTAwMDAsDQogIGV4dGVuZC5kb3duc3RyZWFtID0gNTAwMCwNCiAgZ3JvdXAuYnkgPSAic2FtcGxlIg0KKQ0KYGBgDQpgYGB7cn0NCkNvdmVyYWdlUGxvdCgNCiAgb2JqZWN0ID0gY29tYmluZWRfZGF0YSwNCiAgcmVnaW9uID0gcm93bmFtZXMoZGFfcGVha3MpWzJdLA0KICBleHRlbmQudXBzdHJlYW0gPSAxMDAwMCwNCiAgZXh0ZW5kLmRvd25zdHJlYW0gPSA1MDAwLA0KICBncm91cC5ieSA9ICJzYW1wbGUiDQopDQpgYGANCg0KYGBge3J9DQpwbG90MSA8LSBWbG5QbG90KA0KICBvYmplY3QgPSBjb21iaW5lZF9kYXRhLA0KICBmZWF0dXJlcyA9IHJvd25hbWVzKGRhX3BlYWtzKVsxXSwgICAgICAgICAgICANCiAgcHQuc2l6ZSA9IDAuMSwgICAgICAgICAgICAgICAgICAgDQogIGdyb3VwLmJ5ID0gInNhbXBsZSIgICAgICAgICAgICAgIA0KKQ0KDQpwbG90MiA8LSBGZWF0dXJlUGxvdCgNCiAgb2JqZWN0ID0gY29tYmluZWRfZGF0YSwNCiAgZmVhdHVyZXMgPSByb3duYW1lcyhkYV9wZWFrcylbMV0sDQogIHB0LnNpemUgPSAwLjEsDQogIG1heC5jdXRvZmYgPSAncTk1Jw0KKQ0KcGxvdDEgfCBwbG90Mg0KYGBgDQoNCg0KYGBge3J9DQpwbG90MSA8LSBWbG5QbG90KA0KICBvYmplY3QgPSBjb21iaW5lZF9kYXRhLA0KICBmZWF0dXJlcyA9IHJvd25hbWVzKGRhX3BlYWtzKVsyXSwgICAgICAgICAgICANCiAgcHQuc2l6ZSA9IDAuMSwgICAgICAgICAgICAgICAgICAgDQogIGdyb3VwLmJ5ID0gInNhbXBsZSIgICAgICAgICAgICAgIA0KKQ0KDQpwbG90MiA8LSBGZWF0dXJlUGxvdCgNCiAgb2JqZWN0ID0gY29tYmluZWRfZGF0YSwNCiAgZmVhdHVyZXMgPSByb3duYW1lcyhkYV9wZWFrcylbMl0sDQogIHB0LnNpemUgPSAwLjEsDQogIG1heC5jdXRvZmYgPSAncTk1Jw0KKQ0KcGxvdDEgfCBwbG90Mg0KYGBgDQpgYGB7cn0NCnNlc3Npb25JbmZvKCkNCmBgYA0KDQo=